home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / answers / comp / 386bsd-faq / part4 < prev    next >
Internet Message Format  |  1994-04-01  |  35KB

  1. Path: bloom-beacon.mit.edu!hookup!news.kei.com!eff!usenet.ins.cwru.edu!howland.reston.ans.net!news.cac.psu.edu!news.pop.psu.edu!ctc.com!news.mic.ucla.edu!ux1.lmu.edu!cynjut.ogisd.ess.harris.com!jocas-al.brooks.af.mil!hrd769.brooks.af.mil!not-for-mail
  2. From: burgess@hrd769.brooks.af.mil (Dave Burgess)
  3. Newsgroups: comp.os.386bsd.announce,comp.answers,news.answers
  4. Subject: [comp.os.386bsd] BNR/2 derived BSD for PCs FAQ (Part 4 of 10)
  5. Followup-To: comp.os.386bsd.misc
  6. Date: 31 Mar 1994 21:37:38 -0000
  7. Organization: Armstrong Laboratory, Brooks AFB, TX
  8. Lines: 895
  9. Approved: news-answers-request@MIT.Edu
  10. Distribution: world
  11. Expires: 04/18/94
  12. Message-ID: <386bsd-faq-4-765149856@hrd769.brooks.af.mil>
  13. References: <386bsd-faq-1-765149856@hrd769.brooks.af.mil>
  14. Reply-To: 386bsd-faq@hrd769.brooks.af.mil (386bsd FAQ Maintainer)
  15. NNTP-Posting-Host: hrd769.brooks.af.mil
  16. Xref: bloom-beacon.mit.edu comp.os.386bsd.announce:309 comp.answers:4389 news.answers:17178
  17.  
  18. Posted-By: auto-faq 2.4
  19. Archive-name: 386bsd-faq/part4
  20.  
  21. Section 3.    (Kernel Building and Maintenance)
  22.  
  23. 3.0    System Internals
  24.     
  25.     One of the interesting aspects of *BSD is the fact that it comes 
  26.     with the complete source.  This allows you to make changes to the 
  27.     system, recompile, and test out your new ideas.  This section of 
  28.     the FAQ describes many of the different aspects of this endeavor 
  29.     and common problems and pitfalls that are encountered.  Kevin Lahey 
  30.     provided the substantial portion of this section.  You can contact 
  31.     him via E-Mail at (kml@rokkaku.atl.ga.us) or contact Dave Burgess 
  32.     (burgess@hrd769.brooks.af.mil).
  33.  
  34.  
  35.  
  36. 3.1    Kernel
  37.  
  38. 3.1.1    How do I build a kernel?
  39.  
  40.     The kernel can be compiled in a variety of ways to support different 
  41.     devices and configurations.  Compilation is controlled by a config 
  42.     file that specifies the characteristics of the kernel.  A set of 
  43.     different config files is located in /sys/i386/conf or 
  44.     /sys/arch/i386/conf.  The configuration file names are in upper case.
  45.  
  46.     To build a particular kernel (in this example, we use the GENERICISA
  47.     configuration file in NetBSD or FreeBSD):
  48.  
  49.     % cd /sys/i386/conf
  50.     % config GENERICISA
  51.     % cd /sys/compile/GENERICISA
  52.     % make depend
  53.     % make
  54.  
  55.     You'll need patch 1 from the patchkit to get the compilation to work,
  56.     'cause the version file isn't correctly included in the Makefile.
  57.  
  58.  
  59. 3.1.2    I want to do one of the following things:
  60.     * add a device not in the distributed kernel (third com
  61.       port, additional disk or tape, line printer driver, etc).
  62.     * use a patch from the net or the patchkit to fix a kernel bug.
  63.     * add another swap device.
  64.     * recompile the kernel to remove extraneous devices so that
  65.       it takes up less space.
  66.     * configure more pseudo-terminals to allow for more xterms
  67.       or network logins.
  68.     
  69.     You're going to have to recompile the kernel after you modify the 
  70.     config file.  See section 3.2 below for more information about the 
  71.     config file in general.
  72.     
  73.  
  74. 3.1.3    I don't have the source distribution -- how can I rebuild the
  75.     kernel?
  76.  
  77.     There are reference sites available, as well as the 'good 
  78.     net-neighbor' policy, whereby you could make arrangements with a 
  79.     net neighbor to use a large local machine as a Network File System, 
  80.     or allow you to compile a new kernel on their machine and transfer it 
  81.     to yours.  If you *still* can't fit it in, you'll have to ftp a 
  82.     compiled kernel from agate in the unofficial/patchkit-old directory 
  83.     or one of the archive sites.  You can also ask for help from 
  84.     comp.os.386bsd.questions if you get stuck and cannot make any headway.
  85.  
  86.  
  87. 3.1.4    Now that I have a kernel, how do I install it?
  88.  
  89.     Your kernel is called /386bsd or /netbsd.  Copy the new kernel from 
  90.     /sys/compile/GENERICISA/386bsd to /, assuming that it is in that 
  91.     directory.  This is relatively straightforward; there are a couple 
  92.     of things to remember, though.  First, if you really screw up the new 
  93.     kernel, you want to have something to fall back on, so be sure to 
  94.     save /386bsd to /386bsd.old before copying in a new kernel.  Second, 
  95.     if you just copy the new kernel over the currently running kernel, 
  96.     funny things can happen.  Be sure to move aside the currently running 
  97.     kernel before copying over the new one.  
  98.  
  99.     There are folks that have reported that overwriting their current 
  100.     kernel has never caused them any real problems.  On the other hand, 
  101.     if the old kernel was working and the new one doesn't, and you have 
  102.     made changes that require that old kernel, it should be available to 
  103.     the system, and saving it to /386bsd.alt or /386bsd.old are reasonable 
  104.     things to do.
  105.  
  106.     If you are really paranoid, you can mount a new fixit floppy and 
  107.     replace its kernel with the one you just built, and then boot from 
  108.     the fixit floppy to make sure everything will work.  This is a 
  109.     pretty good idea if you are making radical changes or if you are 
  110.     unsure about your changes.
  111.   
  112.  
  113. 3.1.5    After installing the patchkit and recompiling the kernel with the
  114.     option "WD8013", I am no longer able to reboot the machine.  A cold
  115.     boot (power on) runs fine, but after a reboot no boot drive is found
  116.     by the BIOS.  Besides having a 16-bit WD/SMC Ethernet card installed
  117.     the machines try to boot using either a Adaptec 1742 or 1542 SCSI
  118.     board to boot from.
  119.  
  120.     This answer was provided by Hellmuth Michaelis (hm@hcshh.hcs.de) and 
  121.     written by Rodney Grimes (rgrimes@acacia).
  122.  
  123.     Remove "option WD8013" from the config files and recompile and
  124.     reinstall the kernel. 
  125.  
  126.     The reason that option WD8013 often causes this reboot problem is 
  127.     this:
  128.     
  129.     There is a requirement that all memory within a 128k bank in the
  130.     0xA0000 to 0xFFFFF region be either 16-bit or 8-bit.  On a cold 
  131.     boot, the WD8013 boards are reset to 8-bit mode, the POST
  132.     (Power On Self Test) passes without error.  386bsd comes up, the 
  133.     if_we.c driver places the WD8013 in 16-bit mode.  Now on a soft boot
  134.     when the BIOS runs some quick POST tests it finds a problem in the 
  135.     0xA000 to 0xF000 region.  You probably get a "beep-beep" when this
  136.     happens.  It means you have a memory size conflict.
  137.     The machine has been mis-configured.
  138.     
  139.       This is a little known fact about 16-bit vs 8-bit option cards.  It
  140.     has caused more than one person to go crazy tracking down what they
  141.     swear is a bug in the program.  It is not, it is a flaw in the design
  142.     of the ISA bus.  The signal MEMCS16- must be returned the same for
  143.     every 128k block of memory:
  144.     
  145.         B0000-CFFFF    Must all be either 8-bit or 16-bit.
  146.         D0000-FFFFF    Must all be either 8-bit or 16-bit.
  147.     
  148.       In your particular configuration (WD8013 @ cc000) I suspect that
  149.     you have another board in the B0000-CFFFFF region that is 8-bit, i.e.
  150.     your Adaptec has an 8-bit BIOS on it!
  151.     
  152.       Try moving the board to the 0xD0000 region and see if it works there,
  153.     you may still have a problem as many modern system BIOSes are now
  154.     8-bit.
  155.     If your system BIOS is 8-bit, try shadowing the system BIOS region
  156.     at 0xF0000 to 0xFFFFF, this effectively turns it into a 16-bit BIOS.
  157.     
  158.       Do not attempt to shadow the WD8013, it well cause you many
  159.       headaches.
  160.     
  161.       As always, works for me, you mileage may vary..
  162.     
  163.  
  164. 3.1.6    My system is comaplaining about stray interrupt 7.  Is my machine 
  165.     going to explode or anything?
  166.  
  167.     No.  They are caused by lots of things.  They are, as far as
  168.     anyone that should be expected to know about this stuff, harmless.
  169.  
  170.     These stray interrupts are caused by something in the PC.  
  171.     I have yet to see a convincing explanation of precisely what,
  172.     but they are definitely caused by something.  There are three
  173.     ways to deal with this problem.
  174.  
  175.     1)  Ignore them.  They are spurious and do not effect the
  176.     operation of your computer.
  177.  
  178.     2)  Implement the lpt driver.  This way, the driver traps 
  179.     (the lpt driver expects IRQ 7) and then quietly discards them.  
  180.     That is why when folks implement the lpt driver the 'problem' 
  181.     goes away.  The computer is taught how to ignore them.
  182.  
  183.     3)  Do what the original 386bsd code did.  Comment out the
  184.     diagnostic and associated code that tries to deal with them so
  185.     you don't see the error message.
  186.  
  187.     
  188. 3.1.7    I found a bug in the kernel.  How do I report it?
  189.  
  190.     Both NetBSD and FreeBSD include a facility called 'bugfiler'.  
  191.     While the instructions are included in both system, there is 
  192.     still some apparent confusion about when to use (and when to
  193.     NOT use) bugfiler.
  194.  
  195.     Jordan K. Hubbard (jkh@whisker.lotus.ie)  provides us with this
  196.     short article.
  197.  
  198.     To send bug reports, you want to use the sendbug(1) command.
  199.     The entire package for sending and filing these bugs is known 
  200.     as "the bugfiler", which is where the confusion stepped in, 
  201.     but sendbug is definately the command you want to use.
  202.  
  203.     Second, it doesn't take a "net connection" to use sendbug, 
  204.     since all it does is package up your "bug report form" and mail 
  205.     it to us; no direct internet connectivity is required, just mail.
  206.  
  207.     So if you can send internet mail you can use sendbug, or you can 
  208.     also send mail to the `FreeBSD-bugs@freefall.cdrom.com' address 
  209.     (do NOT send it to FreeBSD.cdrom.com since it will BOUNCE, this 
  210.     is not the place to send bugs to, just to ftp stuff from!).
  211.  
  212.     NetBSD has a similar facility, but has a different host for bug 
  213.     reports.
  214.  
  215.  
  216. 3.1.8    Can someone please give a reasonably clear set of instructions 
  217.     as to how to get a "current" version of NetBSD running?
  218.  
  219.     Marc Wandschneider <marcwan@microsoft.com> provided this description
  220.     of what he did to upgrade to the current version of NetBSD:
  221.  
  222.     1. Delete the old source tree, saving what I wanted to (a bunch
  223.     of files moved around, and just unpacking the new one over the old
  224.     will cause some problems)
  225.  
  226.     2. Unpacked the new source tree.
  227.  
  228.     3. ran the following sequence of commands:
  229.  
  230.         cd /usr/src/share/mk; make install
  231.         cd /usr/src/include; make && make install
  232.            setenv LDSTATIC -static
  233.            setenv NOPIC
  234.         cd /usr/src/lib/libc; make && make install
  235.         cd /usr/src/gnu/lib/libmalloc; make && make install
  236.            cd /usr/src/gnu/usr.bin/gas; make && make install
  237.            cd /usr/src/gnu/usr.bin/ld; make && make install
  238.         # You'll probably get some barfage from the above because 
  239.         # ld.so won't build yet.  Ignore it and install ld anyway.
  240.            cd /usr/src/gnu/usr.bin/gcc; make && make install
  241.            unsetenv NOPIC LDSTATIC
  242.            cd /usr/src/lib ; make && make install
  243.            cd /usr/src/gnu/lib ; make && make install
  244.         cd /usr/src/gnu/usr.bin/ld; make && make install
  245.            cd /usr/src; make && make install
  246.  
  247.     At some point during the installation, your system will be 
  248.     fixed enough that many of these steps will no longer be required.
  249.     For example, the new 'make' defines the variables OBJDIR and 
  250.     MACHINE_ARCH for you, so you will not need those  once you get to
  251.     that point.  Until then, the following procedure may suit your
  252.     needs better.
  253.  
  254.         setenv MACHINE_ARCH i386
  255.         cd /usr/src/share/mk; make install
  256.         cd /usr/src/include; make obj && make && make install
  257.            setenv LDSTATIC -static
  258.            setenv NOPIC
  259.         cd /usr/src/lib/libc; make obj && make && make install
  260.         cd /usr/src/gnu/lib/libmalloc; make obj && make && make install
  261.            cd /usr/src/gnu/usr.bin/gas; make obj && make && make install
  262.            cd /usr/src/gnu/usr.bin/ld; make obj && make && make install
  263.          # You'll probably get some barfage from the above because 
  264.          # ld.so won't build yet.  Ignore it and install ld anyway.
  265.            cd /usr/src/gnu/usr.bin/gcc; make obj && make && make install
  266.            unsetenv NOPIC LDSTATIC
  267.            cd /usr/src/lib ; make obj && make && make install
  268.            cd /usr/src/gnu/lib ; make obj && make && make install
  269.         cd /usr/src/gnu/usr.bin/ld; make obj && make && make install
  270.            cd /usr/src; make obj && make && make install
  271.  
  272.     NOTE: At some point, you might very well come across an unresolved
  273.     external __DYNAMIC in crt0.o.  If this happens, edit the makefile
  274.     for crt0.o (lib/csu/i386) and remove the -DDYNAMIC flag)
  275.     make && make install.  Then put the flag back in the makefile
  276.     (but don't rebuild it until the natural order of things dicates
  277.     that it happen)
  278.  
  279.     And Theo Deraadt provides this guidance when you get an error like 
  280.     "init_main.o: Undefined symbol _pdevinit referenced from text segment."
  281.  
  282.     You need to
  283.         (1) install new config
  284.         (2) make clean
  285.         (3) re-config your kernel
  286.     then this goes away
  287.  
  288.  
  289. 3.2    What exactly is this config file, anyway?  What are all of these 
  290.     cryptic notations?
  291.  
  292.     I've annotated the distributed GENERICISA file;  my comments are 
  293.     delineated by the '--' symbols.
  294.  
  295.     #
  296.     # GENERICISA -- Generic ISA machine -- distribution floppy
  297.     #
  298. --  BSD can be compiled for different hardware platforms, so it is important to
  299. --  define the hardware types.  386bsd can only be built for 386 or
  300. --  compatible machines, so this is sort of superfluous, but maintains
  301. --  compatibility with standard BSD config files.
  302.     machine        "i386"
  303.     cpu        "i386"
  304. --  The ident describes the machine for which this kernel is to be built.
  305. --  It is usually the system name -- "ROKKAKU", "REF", or whatever.
  306. --  This can be used for conditional compilation, so that kernel changes
  307. --  can be compiled in only for one machine.
  308.     ident        GENERICISA
  309. --  This should indicate the timezone of the system relative the
  310. --  Greenwich.   8 is PST;  4 is EST.  Somebody else might want to discuss
  311. --  this more fully.
  312.     timezone    8 dst
  313. --  maxusers isn't strictly checked;  it is just used to size several
  314. --  system data parameters.
  315.     maxusers    10
  316. --  The options control the conditional compilation of features into the
  317. --  kernel.  The options can be listed all on a line separated by commas.
  318. --  They are #define'ed when the kernel is compiled, so that #ifdef's
  319. --  will work.  An option can be given a value by appending an equals sign
  320. --  and a value (enclosed in double quotes) to the option name.
  321.     
  322. --  Hopefully the names are at least somewhat self-explanatory.  To
  323. --  discover what everything does, you'd have to go through the kernel
  324. --  looking for all of the appropriate #ifdef's.
  325.     
  326. --  [Perhaps somebody else could list the *exact* meanings of these
  327. --  options and some of the other possible options?]
  328.     options        INET,ISOFS,NFS
  329.     options        "COMPAT_43"
  330.     options        "TCP_COMPAT_42"
  331.     
  332. --  The config line controls the location of the root, swap, and dump
  333. --  devices.  Anything not specified is defaulted.  This is where you add
  334. --  support for multiple swap devices.  Just list 'em, separated by 'and'.
  335. --  The config line below identifies the root drive as wd0 and the
  336. --  swap drives as wd0 and as0.  See the section on swap devices in FAQ_02
  337. --  for additional information.
  338.     config        "386bsd"    root on wd0 swap on wd0 and as0
  339. --  A 'controller' is a device or bus controller.  'isa' is obviously for
  340. --  the ISA bus.  'wd0' is for regular disk controllers,  'fd0' is for the
  341. --  floppies, and 'as0' is for SCSI disk controllers.
  342.     controller    isa0
  343. --  The fields work as follows:
  344.     
  345. --  a.  What do you call this device?  
  346. --  b.  What controller is this on?  As you can see, the disk controller
  347. --  talks to the ISA bus, and the disks talk to the disk controller.
  348. --  c.  Where are the registers for the controller mapped into memory?
  349. --  This is #defined in /sys/i386/isa/isa.h.
  350. --  d.  What IRQ is this device set up for?
  351. --  e.  What routine should be called on an interrupt from the device?
  352.     
  353. --             a          b           c             d           e
  354. --            vvv        vvv       vvvvvvv          vv        vvvvvv
  355.     controller    wd0    at isa? port "IO_WD1" bio irq 14 vector wdintr
  356. --  You need a 'disk' entry for every disk on the controller.  In the
  357. --  config file originally shipped with 386bsd, both hard disks were 
  358. --  incorrectly identified as wd0.  Be sure to change the second occurrence 
  359. --  to wd1, as I have done in below.
  360.     disk        wd0    at wd0 drive 0
  361.     disk        wd1    at wd0 drive 1
  362.     
  363.     controller    fd0    at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
  364.     disk        fd0    at fd0 drive 0
  365.     disk        fd1    at fd0 drive 1
  366.  
  367. --  The 'drq' specifies the channel used for bus-mastering DMA.
  368.     controller    as0    at isa? port 0x330 bio irq 11 drq 5 vector asintr
  369.     disk        as0    at as0 drive 0
  370.     disk        as1    at as0 drive 1
  371.  
  372. --  Define other physical devices.  pc0 is the keyboard, npx0 drives the
  373. --  math coprocessor, and com* controls the com ports.
  374.     device        pc0    at isa? port "IO_KBD" tty irq 1 vector pcrint
  375.     device        npx0    at isa? port "IO_NPX" irq 13 vector npxintr
  376.     device        com1    at isa? port "IO_COM1" tty irq 4 vector comintr
  377.     device        com2    at isa? port "IO_COM2" tty irq 3 vector comintr
  378.     
  379. --  Ethernet drivers of various sorts and the particular configuration
  380. --  information they require.  For most installations, only one of these 
  381. --  devices would normally be defined.
  382.     device we0 at isa? port 0x280 net irq 2 iomem 0xd0000 iosiz 8192 vector weintr
  383.     device ne0 at isa? port 0x300 net irq 2 vector neintr
  384.     device ec0 at isa? port 0x250 net irq 2 iomem 0xd8000 iosiz 8192 vector ecintr
  385.     device is0 at isa? port 0x280 net irq 10 drq 7 vector isintr
  386.  
  387. --  Tape driver
  388.     device        wt0    at isa? port 0x300 bio irq 5 drq 1 vector wtintr
  389.     
  390. --  The TCP/IP loop-back device, ethernet interface, slip interface, log
  391. --  device, and pseudo-terminals.
  392.     pseudo-device    loop
  393.     pseudo-device    ether
  394.     pseudo-device    sl    2
  395.     pseudo-device    log
  396.     pseudo-device    pty    4
  397.     
  398. --  Devices required by VM. 
  399.     pseudo-device    swappager
  400.     pseudo-device    vnodepager
  401.     pseudo-device    devpager
  402.  
  403.     Normally, there is an annotated configuration file called ALL which
  404.     gives a list of all of the options for the configuration file.
  405.     
  406.  
  407. 3.2.1    Okay, fine.  Why shouldn't I just add every device I can find to
  408.     the kernel, so I'll never have to recompile this again?
  409.  
  410.     Because it takes up space.  The kernel is wired into memory, so every 
  411.     byte it uses comes out of the pool of memory for everything else.  It 
  412.     can't page out sections that aren't in use.  If your kernel is larger 
  413.     than 640K, then it can't be loaded.  You'll need to use Julian Elischer's
  414.     bootblocks to put it in high memory, which seem to be fairly complex.
  415.     Installing them (once they are compiled) is as easy as using disklabel.
  416.  
  417.  
  418. 3.2.2    What should I remove from the kernel?
  419.  
  420.     What do you need?  If you only have an SCSI controller, you don't 
  421.     need the wd0 device;  if you have another kind of disk controller, 
  422.     you don't need as0.  Unless you actually HAVE more than one Ethernet 
  423.     controller, you should comment out all but one of them.  If you don't 
  424.     have an ethernet controller, you don't need any of the controllers or 
  425.     NFS compiled in.   Without a CD-ROM, ISOFS is kind of pointless.  Just 
  426.     look at what you have and think about what you really need.
  427.  
  428.  
  429. 3.2.3    I can't get enough remote login sessions or xterm sessions.  I also
  430.     can only get four seesions working at a time.  What can I do?
  431.  
  432.     Increase the count of pseudo-terminals --
  433.  
  434.     pseudo-device    pty    12  # or whatever
  435.  
  436.     Every pseudo terminal should have a /dev/pty* entry.  If you have 12
  437.     pseudo terminals, you should also have at least 12 pty devices in the
  438.     /dev directory.  The MAKEDEV script in /dev will create as many pseudo-
  439.     terminals as you tell it to.
  440.  
  441.  
  442. 3.2.4    How do I get ddb, the kernel debugger, compiled into the kernel
  443.     and running?
  444.  
  445.     Add the following line to the configuration file:
  446.  
  447.     pseudo-device    ddb
  448.  
  449.     Build the kernel, then run dbsym on it:
  450.  
  451.     % dbsym ./386bsd
  452.  
  453.     Install it and go for it.  Ctl-Alt-Esc drops you into the debugger.
  454.  
  455.     Note: DDB as shipped originally is a memory hog, and it is very
  456.     difficult to get a kernel small enough with enough fun things in it
  457.     to debug in 640K
  458.  
  459.  
  460. 3.2.5    Can I have more than one config file?  Should I rename it to something
  461.     else?  Any other hints?  
  462.  
  463.     You can create as many (or as few) config files as you desire.  The 
  464.     system, once the patchkit is applied, will have between 10 and 15, 
  465.     each of which implements certain functions or features.  In addition, 
  466.     the normal place for the patchkit to make changes to the config files 
  467.     is in the GENERICISA file.  Since this file should remain unchanged 
  468.     and available, it is always a good idea to copy this file to a 
  469.     meaningful name and modify that file.  In other words, change every 
  470.     reference in 3.1.1 from GENERICISA to HAL (or whatever you call your 
  471.     system).
  472.  
  473.     One final note.  Every /sys/compile directory takes up 800K or so;
  474.     you might want to watch to see how big these all get.
  475.  
  476.  
  477.  
  478. 3.2.6    What is the meaning of the trap codes I get in panic messages?
  479.     Sometimes this message appears in the form "trap type nn".
  480.  
  481.     That message means that the system received an unexpected (and
  482.     unwanted) trap that probably indicates some form of kernel bug.
  483.     These traps, are usually received from the kernel, in which case
  484.     the trap.h definitions should be used.
  485.  
  486.     The number (which appears in place of "nn" above) is *NOT* the 
  487.     i386 or i386 trap type, it is a BSD-defined trap type number.
  488.  
  489.     The definitions of the various trap types can be found in
  490.     /usr/include/machine/trap.h.
  491.  
  492.     two of the more common ones are:
  493.           9    T_PROTFLT    protection fault
  494.                 (The kernel tried executing code
  495.                 which was not noted as "executable".
  496.                 This happens if the kernel jumps to
  497.                 a bogus location.)
  498.          12    T_PAGEFLT    page fault
  499.                 (The kernel tried to access a bogus
  500.                 area of memory.  This can happen if
  501.                 an invalid pointer is dereferenced.)
  502.  
  503.  
  504.     This is a list of i386 trap codes (just to confuse the issue).
  505.  
  506. Trap    0    Divide Error
  507.         The DIV or IDIV instruction is executed with a zero denominator
  508.         or the quotient is too large for the destination operand.
  509.     
  510.     
  511. Trap    1    Debug Exceptions
  512.         Used in conjunction with DR6 and DR7, The following flags
  513.         need to be tested to determine what caused the trap:
  514.         BS=1                Single-step trap
  515.         B0=1 AND (GE0=1 or LE0=1)    Breakpoint, DR0, LEN0, R/W0
  516.         B1=1 AND (GE1=1 or LE1=1)    Breakpoint, DR1, LEN1, R/W1
  517.         B2=1 AND (GE2=1 or LE2=1)    Breakpoint, DR2, LEN2, R/W2
  518.         B3=1 AND (GE3=1 or LE3=1)    Breakpoint, DR3, LEN3, R/W3
  519.         BD=1                Debug registers not available,
  520.                         in use by ICE-386
  521.         BT=1                Task Switch
  522.             
  523.     
  524. Trap    2    NMI Interrupt
  525.         On PC/AT systems, the NMI input to the CPU is usually
  526.         connected to the main memory parity circuit.  By the time the
  527.         error signal is generated, the data may have already been
  528.         used in an instruction, so it isn't possible to reliably
  529.         recover.
  530.     
  531.         And some not-so-common causes (from various sources):
  532.  
  533.           PS50+ : I/O channel check, system watch-dog timer 
  534.           time-out interrupt, DMA timer time-out interrupt
  535.  
  536.           parity errors on any 8-bit or 16-bit board pulling the 
  537.           IOCHCK* line low 
  538.  
  539.           first generation of auto-switching EGA cards used NMI to trap port
  540.           access for CGA emulation (e.g., ATI's EGA Wonder)
  541.     
  542.           Zeos Notebook low battery (perhaps other battery-based 
  543.           computers)
  544.  
  545.  
  546. Trap    3    Breakpoint
  547.         The result of executing an INT 3 instruction.  MS-DOS and
  548.         Windows and some other non-386 systems use this for debugging.
  549.         Code specific to the 386 and later processors should use
  550.         the debugging features tied to Trap 1.
  551.     
  552.     
  553. Trap    4    INT0 Detected Overflow
  554.         Occurs if an INT0 instruction is executed and the overflow
  555.         flag (OF) is currently set.
  556.     
  557.     
  558. Trap    5    BOUND Range Exceeded
  559.         Occurs if the BOUND instruction is executed and the array
  560.         index points beyond the area of memory containing the array
  561.         being tested.
  562.     
  563.     
  564. Trap    6    Invalid Opcode
  565.         The value read at CS:IP is not a valid opcode.
  566.     
  567.     
  568. Trap    7    Coprocessor Not Available
  569.         This occurs if the processor fetches an instruction that is
  570.         for the coprocessor and no coprocessor is present.
  571.     
  572.     
  573. Trap    8    Double Exception (Fault)
  574.         An exception occurred while trying to execute the handler
  575.         for a prior exception.  Example, an application causes a
  576.         General Protection Fault (13) and the area of memory where
  577.         the GPF handler should be is flagged not-present (paged-out?).
  578.         The double-fault handler is invoked in these conditions.
  579.         If a fault occurs while trying to run the double-fault handler,
  580.         a triple-fault occurs and the CPU resets.
  581.     
  582.         The rules for deciding if a double-fault should occur or
  583.         if the two faults can be handled serially are discussed in
  584.         more detail in the Intel song book.
  585.     
  586.     
  587. Trap    9    Coprocessor Segment Overrun
  588.         A page or segment violation occurred while transferring
  589.         the middle part of a coprocessor operand to the NPX.
  590.     
  591.     
  592. Trap    10    Invalid Task State Segment
  593.         During a task switch, the new TSS was invalid.  Here is
  594.         a table of conditions that Invalidate the TSS:
  595.         TSS id + EXT    The limit in the TSS descriptor is < 103
  596.         LTD id + EXT    Invalid LDT selector or LDT not present
  597.         SS id + EXT    Stack segment selector is outside table limit
  598.         SS id + EXT    Stack segment is not a writable segment
  599.         SS id + EXT    Stack segment DPL does not match new CPL
  600.         SS id + EXT    Stack segment selector RPL <> CPL
  601.         CS id + EXT     Code segment is outside table limit
  602.         CS id + EXT    Code segment selector does not refer to
  603.                     code segment
  604.         CS id + EXT    DPL of non-conforming code segment <> new CPL
  605.         CS id + EXT    CPL of conforming code segment > new CPL
  606.         DS/ES/FS/GS id + EXT    DS, ES, FS or GS segment selector is
  607.                     outside table limits
  608.         DS/ES/FS/FS id + EXT    DS, ES, FS, or GS is not readable
  609.                     segment
  610.  
  611.  
  612. Trap    11    Segment Not Present
  613.         Occurs when the "present" bit of a descriptor is zero.
  614.         This can occur while loading any of these segment registers
  615.         CS, DS, ES, FS, or GS.  Loading SS causes a Stack fault.
  616.         Also occurs when attempting to use a gate descriptor that is
  617.         marked "not present", and if attempting to load the LDT with
  618.         an LLDT instruction.  Note that loading the LDT during a
  619.         task switch causes an "invalid TSS" trap.
  620.  
  621.  
  622. Trap    12    Stack Fault
  623.         A limit violation relating to an address referenced off
  624.         the SS register.  Includes POP, PUSH, ENTER and LEAVE
  625.         opcodes, as well as references such as MOV AX,[BP+8]
  626.         (which has an implied SS:).
  627.         Also causes by loading SS with a descriptor that is marked
  628.         "not present".
  629.  
  630.  
  631. Trap    13    General Protection Fault (GPF)
  632.         Americas Favorite, in the Windows 3.0 world, it is known as
  633.         the UAE error.  The instruction tried to access data out of
  634.         the bounds designated by the descriptors.  The access that
  635.         failed can be a read, write or instruction fetch.  There are
  636.         15 classifications of GPFs:
  637.         1.  Exceeding segment limit when using CS, DE, ES, FS or GS.
  638.         2.  Exceeding segment limit when referencing a descriptor
  639.             table.
  640.         3.  Transferring control to a segment that is not executable.
  641.         4.  Writing into a read-only data segment or into a code
  642.             segment.
  643.         5.  Reading from an execute-only segment.
  644.         6.  Loading the SS register with a read-only descriptor
  645.             (unless the selector comes from the TSS during a task
  646.             switch, in which case a TSS exception occurs.)
  647.         7.  Loading SS, DS, ES, FS or GS with the descriptor of a
  648.             system segment.
  649.         8.  Loading, DS, ES, FS or GS with the descriptor of an
  650.             executable segment that is not also readable.
  651.         9.  Loading SS with the descriptor of an executable segment.
  652.         10. Accessing memory via, DS, ES, FS or GS when the segment
  653.             register contains a null selector.
  654.         11. Switching to a busy task.
  655.         12. Violating privilege rules.
  656.         13. Loading CR0 with a PG=1 and PE=0.
  657.         14. Interrupt or exception via trap or interrupt gate from
  658.             V86 mode to privilege level other than zero.
  659.         15. Exceeding the instruction limit of 15 bytes (this can
  660.             only occur if redundant prefixes are placed before an
  661.             instruction).
  662.         To determine which condition caused the trap, you need
  663.         the instruction, the contents of all associated registers,
  664.         particularly the segment registers involved, then the various
  665.         LDT, GDT and page control tables.  Lots of common coding
  666.         errors cause the GPFs.  Even a stack imbalance will usually
  667.         show up as a GPF.   Even MOV AX,7 MOV ES,AX or 
  668.         MOV AX,5 PUSH AX POP DS will get a GPF error.  You can't
  669.         use a segment register for "temporary storage" of any
  670.         old value the way you could on the 8086.  The values loaded
  671.         into the segment registers are checked in protected mode.
  672.  
  673.  
  674. Trap    14    Page Fault
  675.         The page directory or page table entry needed for the address
  676.         translation has a zero in the present bit, or the current
  677.         procedure does not have sufficient privilege to access the
  678.         indicated page.
  679.  
  680. Trap    15    (reserved)
  681.  
  682.  
  683. Trap    16    Coprocessor Error
  684.         The coprocessor asserted the ERROR# input pin on the 386
  685.         (internal on the 486)
  686.  
  687.  
  688. Trap    17    Alignment Check (486 and later)
  689.         If enabled, this trap will occur if a data fetch does not
  690.         occur on a word boundary.  I don't know of any software that
  691.         activates this feature yet.  I have seen SCO UNIX get this
  692.         error on early Cyrix processors, even though SCO had not
  693.         enabled the feature.
  694.  
  695.  
  696. Trap    18-32    (reserved)
  697.  
  698. [answered by     Frank Durda IV <uhclem@nemesis.lonestar.org>    and
  699.         jim mullens jcm@ornl.gov  -or- mullens@jamsun.ic.ornl.gov]
  700.     
  701. -------------------------------------------------------------------------------
  702.  
  703. 3.2.7    I have been getting a lot of "virtual memory exhausted" errors when 
  704.     I am compiling a program with a really big static array.  I have 
  705.     128Meg of memory and 8Gig of swap.  How can this be happening?
  706.  
  707.     If you are using Csh, you can simply unlimit your processes in 
  708.     your csh.cshrc file.  You can also modify your kernel so that the
  709.     amount of memory available is less limiting.  J"org Wunsch 
  710.     (j@tcd-dresden.de) provides us with this brief description:
  711.  
  712.     From a recent posting i just made, regarding the problem how much
  713.     virtual memory one could get.
  714.  
  715.     | On the other hand, i've also changed the definitions you
  716.     | mentioned. But i didn't like to modify the header files, and
  717.     | actually, modifying the values is as easy as:
  718.     | 
  719.     | options        "DFLDSIZ='(16 * 1024 * 1024)'"
  720.     | options        "MAXDSIZ='(64 * 1024 * 1024)'"
  721.     | 
  722.     | Include the above lines into your kernel's config file, reconfig
  723.     | and rebuild it.
  724.     | 
  725.  
  726.     This is just a hint for those people poking around with compiling
  727.     large source files. Especially, due to some gcc problems with large
  728.     static arrays, compiling X applications with huge bitmaps would
  729.     cause virtual memory trouble. Increasing the limits (o'course, as
  730.     long as the h/w resources suffice) could help there.
  731.  
  732.     The default definitions for the above parameters are found in
  733.     /usr/include/machine/vmparam.h.
  734.  
  735.  
  736. 3.2.8    Where can I learn more about all this?
  737.  
  738.     We've skipped over a lot of details here;  the straight dope comes from
  739.     "Building Berkeley UNIX Kernels with Config", by Samuel J. Leffler and
  740.     Michael J. Karels. 
  741.  
  742. 3.2.9    Does anyone have a system building script that takes things like 
  743.     building a new config and multiple config files into account?
  744.  
  745.     This is the program that I use to rebuild my kernel.  See the note
  746.     in the file about my 'test' program.  You may elect to build a
  747.     new config every time, or not, depending on your requirements.
  748.  
  749.     #! /bin/sh
  750.     #
  751.     #  Script to rebuild the kernel.
  752.     #
  753.     if [ `whoami` != 'root' ] ; then
  754.       echo 'You must be root to successfully proceed from this point'
  755.       exit 1
  756.     fi
  757.     
  758.     #
  759.     # Rebuild Config
  760.     #
  761.     #  NOTE:  The test in this system is from the GNU Shell Utilities
  762.     #  archive and supports the '-nt' command.  Your system may not
  763.     #  have this test, and this section may need to be modified
  764.     #  accordingly.
  765.     #
  766.     if [ /usr/src/usr.sbin/config.new/obj/config.c -nt /usr/sbin/config ] ; then
  767.       echo "Config Up To Date"
  768.     else
  769.      cd /usr/src/usr.sbin/config.new
  770.      make depend
  771.      make
  772.      make install
  773.     fi
  774.     
  775.     cd /sys
  776.     make
  777.     make install
  778.     
  779.     #
  780.     # Modify the local Configuration File
  781.     #
  782.     echo `tput clr`
  783.     cd /sys/arch/i386/conf
  784.     
  785.     if [ "X$CONFIG_NAME" = "X" ]; then
  786.       CONFIG_NAME=GENERIC
  787.     fi  
  788.     
  789.     if [ "X$1" = "X" ]; then
  790.       echo "Configuration Files available:"
  791.       ls [A-Z]*
  792.       echo " "
  793.       echo -n "Enter the name of the config file to use: "
  794.       read CONFIG_NAME
  795.       echo
  796.     else
  797.       CONFIG_NAME=$1
  798.     fi
  799.     
  800.     if [ ! -f $CONFIG_NAME ]; then
  801.       cp GENERICAHA $CONFIG_NAME
  802.     fi
  803.     
  804.     echo "Modifying $CONFIG_NAME config file"
  805.     echo -n "Press return to continue (q to quit) "
  806.     read ans
  807.     
  808.     ans=`echo $ans | cut -c1 | tr 'QqYy' 'qqqq'`
  809.     
  810.     if [ "X$ans" = "Xq" ] ; then
  811.       exit 0
  812.     fi
  813.     
  814.     vi $CONFIG_NAME
  815.     
  816.     #config.new $CONFIG_NAME
  817.     config $CONFIG_NAME
  818.     
  819.     COMPILE_DIR=/sys/arch/i386/compile/$CONFIG_NAME
  820.     
  821.     cd $COMPILE_DIR
  822.     make depend
  823.     make
  824.     
  825.     if [ $? -ge 1 ] ; then
  826.       echo "Errors encountered"
  827.     else
  828.       if [ -f netbsd ] ; then
  829.         PROGNAME=netbsd
  830.       else
  831.         PROGNAME=386bsd
  832.       fi
  833.       echo `tput clr`
  834.       echo ""
  835.       echo "  Manual Installation is recommended.  The following files should be"
  836.       echo "copied/linked/moved to the root directory.  The following steps are"
  837.       echo "suggested:"
  838.       echo ""
  839.       echo "    mv /$PROGNAME /$PROGNAME.old"
  840.       echo "    mv $COMPILE_DIR/$PROGNAME /$PROGNAME"
  841.       echo "    reboot"
  842.       echo ""
  843.       echo "Remember that the new kernel changes will not take place until you "
  844.       echo "re-boot the system."
  845.     fi
  846.  
  847.  
  848. 3.3    X11/XFree86/XS3
  849. 3.3.1    What options should I define to get the X extensions included?
  850.  
  851.     Once you have applied the patch kit, the only thing left to do is to
  852.     modify the config file to include the following line:
  853.  
  854.     options    XSERVER, UCONSOLE
  855.  
  856.     recompile the kernel and the kernel should support X.
  857.  
  858. 3.3.2    Where can I get the FAQ for 'X'?
  859.  
  860.     Answers to frequently asked questions about XFree86 on 386BSD are
  861.     available by anonymous ftp from agate.berkeley.edu (128.32.136.1) in
  862.     /pub/386BSD/0.1-ports/XFree86-1.2/XFree86-1.2-386BSD-FAQ.  It
  863.     supplements the more introductory material distributed with XFree86 
  864.     1.2 in README.386BSD.  It also supplements Steve Kotsopoulos' more 
  865.     general 'X on Intel-based Unix' FAQ available by anonymous ftp from
  866.     export.lcs.mit.edu in /contrib/Intel-Unix-X-faq.
  867.  
  868.  
  869. 3.3.3    Why does X drop characters when using xdm?   When I run xdm 
  870.     from the console, it keeps losing keystrokes and the shift keys 
  871.     don't always work.  Why?
  872.  
  873.         You need to run xdm with the -nodaemon flag.  The reason is
  874.         xdm normally detaches from the keyboard.  This allows other
  875.         processes (like getty) to return to reading from the keyboard.
  876.         A race condition results, where some keystrokes are sent to
  877.         xdm and others are sent to other processes.  Using the
  878.         -nodaemon flag causes xdm to stay attached to the keyboard
  879.         so no other process can use it.  This answer comes from Michael 
  880.         C. Newell (root@wanderer.nsi.nasa.gov)
  881.  
  882.     This bit of trivia is also covered in detail in the X FAQ and 
  883.     the README that accompanies XFree86.
  884.  
  885.  
  886. 3.4    Compiler and Library routines
  887.  
  888.     There are several questions that could probably be included
  889.     here.  See also Section 4 for some of the more common 'missing
  890.     modules' that also happen to be library routines.
  891.  
  892.  
  893. 3.4.1    Which C compiler is shipped with my Net/2 derived BSD? 
  894.  
  895.     The standard compiler released with 386bsd 0.1 is GCC 1.38.  This
  896.     version is considered by many people to be the most stable of
  897.     the GCC versions.  All other Net/2 derived BSD systems have both 
  898.     1.38 and 2.4+ available.  NetBSD 0.9, for example, is completely 
  899.     compilable using GCC 2.5.5, which is included as the default
  900.     compiler.  FreeBSD will also ship with the same compiler.
  901.  
  902. 3.4.2    Where is libcompat.a?
  903.  
  904.     The library libcompat.a is (working from memory here) completely
  905.     deprecated in 386bsd.  The only exceptions might be the re_comp
  906.     and re_exec routines, which are discussed in detail in section 4.
  907.  
  908.     The easiest way around not having a libcompat.a is to simply link 
  909.     it to a small library, since virtually every other function that
  910.     is expected in libcompat.a is already include libc.a.
  911.  
  912.  
  913.